//! 全局单线程存储管理器
//! 
//! ⚠️ 重要：这不再是"全局共享"存储，而是全局单线程Redis服务器
//! 
//! 设计原则：
//! 1. 零锁竞争 - 完全移除Arc<Mutex>
//! 2. 单线程Redis服务器 - 所有命令在一个线程中串行执行
//! 3. 高性能无锁通信 - 使用flume通道

use crate::storage::{SingleThreadRedisServer, CommandResult, RedisServerMode};
use std::sync::{Arc, OnceLock};
// use std::sync::atomic::{AtomicBool, Ordering};  // 已注释：未使用的导入
use tracing::{info, warn};

/// 全局单线程Redis服务器实例
static GLOBAL_REDIS_SERVER: OnceLock<Arc<SingleThreadRedisServer>> = OnceLock::new();
/// 全局存储管理器（重构为单线程架构）
pub struct GlobalStorageManager;

impl GlobalStorageManager {
    pub fn initialize() {
        Self::initialize_with_mode(RedisServerMode::Standalone);
    }
    
    /// 使用指定模式初始化全局Redis服务器
    pub fn initialize_with_mode(mode: RedisServerMode) {
        GLOBAL_REDIS_SERVER.get_or_init(|| {
            info!("🏗️ 初始化全局单线程Redis服务器（零锁设计，模式: {:?}）", mode);
            let mut server = SingleThreadRedisServer::new_with_mode(mode.into());
            server.start(); // 立即启动工作线程
            Arc::new(server)
        });
    }
    
    /// 获取全局Redis服务器的引用
    pub fn get_redis_server() -> Arc<SingleThreadRedisServer> {
        GLOBAL_REDIS_SERVER.get()
            .expect("Global Redis server not initialized")
            .clone()
    }
    
    /// 执行Redis命令（同步版本）
    pub fn execute_command(command: String, args: Vec<String>) -> Result<CommandResult, String> {
        let server = Self::get_redis_server();
        server.execute_command_sync(command, args)
    }
    
    /// 执行Redis命令（异步版本）
    pub async fn execute_command_async(command: String, args: Vec<String>) -> Result<CommandResult, String> {
        let server = Self::get_redis_server();
        server.execute_command(command, args).await
    }
    
    /// 兼容性方法：模拟原有的with_storage接口
    /// 
    /// ⚠️ 注意：这只是为了兼容性，实际上命令是发送到单线程Redis服务器执行的
    pub fn with_storage<F, R>(f: F) -> R
    where
        F: FnOnce() -> R,  // 不再传递可变引用，因为没有直接的存储访问
    {
        warn!("⚠️ with_storage方法已过时，请使用execute_command方法");
        f()  // 简单执行闭包，但不提供存储访问
    }
    
    /// 检查Redis服务器是否正在运行
    pub fn is_running() -> bool {
        if let Some(_server) = GLOBAL_REDIS_SERVER.get() {
            // 这里无法直接检查，返回true表示已初始化
            true
        } else {
            false
        }
    }
    
    /// 获取Redis服务器运行模式
    pub fn get_server_mode() -> RedisServerMode {
        let server = Self::get_redis_server();
        server.get_mode().clone().into()
    }
}

impl Default for GlobalStorageManager {
    fn default() -> Self {
        Self
    }
}